package com.liang.leetcode.user.config;

import cn.dev33.satoken.fun.strategy.SaCorsHandleFunction;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.stp.StpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Sa-Token配置类
 */
@Slf4j
@Configuration
public class SaTokenConfigurer implements WebMvcConfigurer {

    /**
     * 注册Sa-Token拦截器，校验规则为StpUtil.checkLogin()
     * <p>
     * 注意：
     * 1. excludePathPatterns 中的路径不包含 context-path 前缀（/user）
     * 2. 被排除的路径不会进入拦截器，避免上下文未初始化的问题
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handler -> StpUtil.checkLogin()))
                .addPathPatterns("/**")
                // 排除不需要登录的路径（注意：路径不包含context-path前缀）
                .excludePathPatterns(
                        "/oauth/authorize/**",    // OAuth授权URL: /user/oauth/authorize/**
                        "/oauth/callback/**"      // OAuth回调: /user/oauth/callback/**
                );
    }

    /**
     * CORS 跨域处理策略
     */
    @Bean
    public SaCorsHandleFunction corsHandle() {
        return (req, res, sto) -> {
            res.setHeader("Access-Control-Allow-Origin", "*") // 允许指定域访问跨域资源
                    .setHeader("Access-Control-Allow-Methods", "*") // 允许所有请求方式
                    .setHeader("Access-Control-Max-Age", "3600") // 有效时间
                    .setHeader("Access-Control-Allow-Headers", "*"); // 允许的header参数
        };
    }
}